package com.yulintu.utils;

import com.yulintu.common.*;
import com.yulintu.header.Headr;
import com.yulintu.parser.AbstractBodyParser;
import com.yulintu.parser.ImgBodyParser;
import com.yulintu.parser.JsonBodyParser;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;

/**
 * @author caomin
 * @date 2017/10/27
 * @说明 body解析器
 */
@Component
public class FileParserUtils<T> {


    //// TODO: 2017/10/27  需要在AbstractBodyParser与BaseBodyDaoService实现Runable接口
    //  TODO run方法AbstractBodyParser处理的是解析String类型的数据，并把数据放在BodyResult，并把BodyResult放入daoService中的数据中去
    //TODO BaseBodyDaoService处理，用当前的daoService将bodyResult时行持久化，或者写文件


    public void paerser(FileParser fileParser) throws Exception {

        List<Headr> headrs = fileParser.getHeadrs();
        List<FileBodyResult> stringBody = fileParser.getFileBodyResults();

        PkgHeader pkgHeader=new PkgHeader();

        System.out.println("验证文件有效性");
        boolean validate = pkgHeader.setHeadrList(headrs).validate();
        if (!validate){
            return;
        }

        ProcessManager processManager = ProcessManager.getProcessManager();

        //待处理的bodyParser队列
        ArrayBlockingQueue<AbstractBodyParser> abstractBodyParsers = processManager.getAbstractBodyParsers();

        /**
         * 获取具体处理body的parser
         */
        stringBody.stream().forEach(tempData->{
            AbstractBodyParser abstractBodyParser = getBodyParser(tempData.getHeadrs());
            if (abstractBodyParser!=null){
                AbstractBodyParser bodyParser = abstractBodyParser.setData(tempData.getData()).getAbstractBodyParser();
                bodyParser.setFileBodyResult(tempData);
                try {
                    //放入队列中，待处理
                    if (bodyParser!=null){
                        abstractBodyParsers.put(bodyParser);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        });

        /**
         *消费队列里面的数据
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                ExecutorService parserThread = processManager.getParserThread();
                StartBodyParser startBodyParser1 = new StartBodyParser();
                StartDaoParser startDaoParser = new StartDaoParser();
                parserThread.execute(startBodyParser1);
                parserThread.execute(startDaoParser);
            }
        }).start();

        long l = System.currentTimeMillis();

    }

    /**
     * 解析body里面的header获取具体处理器
     * @param
     * @return
     */
    public AbstractBodyParser<T>getBodyParser(List<Headr> headrs){
        for (Headr headr : headrs) {
            String key = headr.getValue();

            if (ContentType.getImg().equalsIgnoreCase(key)){
                return new ImgBodyParser<>();
            }else if (ContentType.getJson().equalsIgnoreCase(key)) {
                return new JsonBodyParser<T>();
            }
        }
        return null;
    }







}
